# 实现一个窗口版本的学生管理系统
#相关头文件
import os.path
import tkinter.messagebox
from tkinter import *
from tkinter import simpledialog

# 通过控制台和用户进行交互
# 创建窗口
root = Tk()
root.title('[学生管理系统]运行窗口')

# 初始化学生列表
# 使用这个全局变量, 来管理所有的学生信息.
# 这个列表的每个元素都是一个 "字典", 每个字典就分别表示了一个同学!
students = []

def save():
    """
       用于存档
    """
    # 此处的路径不是以 D: 开头的 "绝对路径" , 而是相对路径.
    # 此时这个写法的含义就是让 record.txt 和 当前的 学生管理系统.py 在同一个目录里.
    with open('record.txt', 'w', encoding='utf8') as f:
        for s in students:
            f.write(f"{s['studentId']}  {s['name']}    {s['gender']}    {s['className']}\n")
        print(f'[存档成功] 共存储了 {len(students)} 条记录!')

def load():
    """
    用于读档
    """
    # 如果存档文件不存在, 则直接跳过读档流程.
    # 为了避免读方式打开文件的时候, 文件不存在引起异常.
    if not os.path.exists('record.txt'):
        return

    # 读档的时候要保证先把旧的数据给清理干净!
    global students
    students = []
    with open('record.txt', 'r', encoding='utf8') as f:
        # 针对这一行数据, 按照 \t 进行切分操作!
        # 切分之前, 要去除末尾的换行.
        for line in f:
            line = line.strip()
            tokens = line.split('\t')
            if len(tokens) != 4:
                print(f'当前行格式存在问题! line={line}')
                continue
            student = {
                'studentId': tokens[0],
                'name': tokens[1],
                'gender': tokens[2],
                'className': tokens[3]
            }
            students.append(student)
    print(f'[读档成功] 共读取了 {len(students)} 条记录!')


def insert():
    # 新增学生窗口函数
    studentId = simpledialog.askstring("输入窗口", "请输入学生的学号:")
    name = simpledialog.askstring("输入窗口", "请输入学生的姓名:")
    gender = simpledialog.askstring("输入窗口", "请输入学生的性别:")
    if gender not in ('男', '女'):
        print('性别输入的内容不符合要求, 新增失败!')
        return
    className = simpledialog.askstring("输入窗口", "请输入学生的班级:")
    # 使用一个字典把上述的信息给聚合起来.
    student = {
        'studentId': studentId,
        'name': name,
        'gender': gender,
        'className': className
    }
    students.append(student)
    # 新增学生后立即保存
    save()
    tkinter.messagebox.showinfo('Tips', f'[新增学生] 完毕!\n\n[存档成功] 共存储了 {len(students)} 条记录!')


def show():
    # 显示学生信息窗口函数
    # 遍历全局变量的这个列表, 把每个学生的信息给打印出来.
    show_window_2 = Toplevel()
    show_window_2.geometry('480x320')
    show_window_2.title('显示学生信息')

    lb2 = Label(show_window_2, text='学生信息', font=('华文新魏', 16), fg='blue')
    lb2.pack()

    for s in students:
        student_label = Label(show_window_2, text=f"[{s['studentId']}]    {s['name']}    {s['gender']}    {s['className']}\n\n[读档成功] 一共读取了 {len(students)} 条记录!")
        student_label.pack()

    close_button = Button(show_window_2, text='关闭', command=show_window_2.destroy)
    close_button.pack()


def find():
    # 查找学生函数窗口和函数
    # 根据学生姓名, 来进行查找
    name = simpledialog.askstring("输入窗口", "请输入要查找的同学姓名:")
    show_window_3 = Toplevel()
    show_window_3.geometry('480x320')
    show_window_3.title('[查找学生]窗口')

    lb3 = Label(show_window_3, text='您查找的相关学生信息', font=('华文新魏', 16), fg='blue')
    lb3.pack()

    #定次数初始化为0
    count = 0
    for s in students:
        if name == s['name']:
            student_label = Label(show_window_3, text=f"[{s['studentId']}]    {s['name']}    {s['gender']}    {s['className']}\n\n[查找学生] 结束! 共找到了 {count} 个匹配的同学!")
            student_label.pack()
        #每次找到符合的相关学生就+1
        count += 1

    close_button = Button(show_window_3, text='关闭', command=show_window_3.destroy)
    close_button.pack()


def delete():
    # 删除学生信息函数窗口和函数
    studentId = simpledialog.askstring("输入窗口", "请输入要删除的学生学号:")
    # 看看这个学号对应的同学是哪个字典, 然后把这个字典从列表中删掉就好了!
    name = simpledialog.askstring("输入窗口", "请输入要查找的同学姓名:")
    show_window_4 = Toplevel()
    show_window_4.geometry('480x320')
    show_window_4.title('[删除学生]窗口')

    lb3 = Label(show_window_4, text='查找的相关的学生信息', font=('华文新魏', 16), fg='blue')
    lb3.pack()

    for s in students:
        if studentId == s['studentId']:
            student_label = Label(show_window_4, text=f"删除 {s['name']} 同学的信息!\n\n[删除学生] 结束!\n[读档成功] 一共读取了 {len(students)} 条记录!")
            student_label.pack()
            students.remove(s)
            save() # 删除学生后立即保存

    close_button = Button(show_window_4, text='关闭', command=show_window_4.destroy)
    close_button.pack()


def close():
    # 退出系统函数
    show_window_5 = Toplevel()
    show_window_5.geometry('480x320')
    show_window_5.title('[退出系统]窗口')

    lb2 = Label(show_window_5, text='\n\n\nGoodBye！关闭后返回主窗口！\n\n防伪认证：\n\n制作人：黄明祯\n班级：23物联网工程1班\n学号：202308364115', font=('华文新魏', 16), fg='blue')
    lb2.pack()

    close_button = Button(show_window_5, text='关闭', command=show_window_5.destroy)
    close_button.pack()


# 通过窗口和用户进行交互
def main():
    # 设置主窗口大小和背景颜色
    root.geometry('480x480')
    root.configure(bg='#d3fbfb')

    # 显示主窗口大标题"学生管理系统"
    lb1 = Label(root, text='学生管理系统', font=('华文新魏', 32), fg='blue')
    lb1.place(relx=0.1, rely=0.1, relwidth=0.8, relheight=0.1)

    # 添加各功能按钮
    # 通过按钮来作为可选菜单
    #按钮1：新增学生
    btn1 = Button(root, text='1. 新增学生', font=('华文新魏', 14), fg='black', command=insert)
    btn1.place(relx=0.1, rely=0.4, relwidth=0.3, relheight=0.1)

    # 按钮2：显示学生
    btn2 = Button(root, text='2. 显示学生', font=('华文新魏', 14), fg='black', command=show)
    btn2.place(relx=0.6, rely=0.4, relwidth=0.3, relheight=0.1)

    # 按钮3：查找学生
    btn3 = Button(root, text='3. 查找学生', font=('华文新魏', 14), fg='black', command=find)
    btn3.place(relx=0.1, rely=0.7, relwidth=0.3, relheight=0.1)

    # 按钮4：删除学生
    btn4 = Button(root, text='4. 删除学生', font=('华文新魏', 14), fg='black', command=delete)
    btn4.place(relx=0.6, rely=0.7, relwidth=0.3, relheight=0.1)

    # 按钮5：退出系统
    btn5 = Button(root, text='0. 退出系统', font=('华文新魏', 10), fg='red', command=close)
    btn5.place(relx=0.8, rely=0.9, relwidth=0.15, relheight=0.05)

#主窗口环境搭建，包括相关按钮和渲染
main()

# 在主窗口打开时自动调用load函数
load()

#结尾
root.mainloop()
